package day240123

import "fmt"

// 切片 如同 指针 , 是 引用类型
func M切片() {

	//arr := [...]int{1, 2, 3}  //不定长度
	//数组写法：arr := [5]int{1, 2, 3} //空位置 补 默认值 0
	//切片写法：arr := [ ]int{1, 2, 3}
	//声明时 没赋初始值， 为空 也就是nil
	var slice []string        // 切片
	fmt.Println(slice)        // []
	fmt.Println(slice == nil) // true
	fmt.Printf("%p", slice)   // 0x0	 说明没有内存地址

	//定义切片
	Anames := []string{"smallming", "测试1"} //[ ] 没写长度
	fmt.Println("[]string=", Anames)       //[]string = [smallming 测试1]
	fmt.Println(Anames[0], Anames[1])      //smallming 测试1
	Anames[0] = "改变了"
	fmt.Println(Anames) //[改变了 测试1]

	//切片是引用类型
	names := []string{"aaa", "测试2"} //如果{}有内容，则会分配内存地址
	fmt.Println(names)              //[aaa 测试2]
	names1 := names
	fmt.Println(names1, names) //[aaa 测试2] [aaa 测试2]

	fmt.Printf("赋值前的地址：%p %p", names1, names)
	names1[0] = "bbb"
	fmt.Println(names, names1)         //	[bbb 测试2] [bbb 测试2]
	fmt.Printf("%p %p", names1, names) //地址一样
	fmt.Println("切片是引用类型，2个切片:=之后，值和地址都相同，但是数组:=之后，值相同，地址不同")
	arr1 := [5]int{1, 2, 3, 4, 5}
	arr2 := arr1
	fmt.Printf("%p %p", &arr1, &arr2) //0xc00000c3c0 0xc00000c3f0C 的地址不一样

	fmt.Println("C#的数组是引用传递.  Go 语言中一切都是值传递，没有引用传递")
	fmt.Println("切片的本质是struct结构体，另外，切片结构体中的array是一个指针，")
	fmt.Println("意味着array的值是底层数组的地址，通过函数传参后，这个值依然没有改变。")
}
